package com.fourth.service.impl;

import com.fourth.dto.OrdersDto;
import com.fourth.entity.Orders;
import com.fourth.dao.OrdersMapper;
import com.fourth.service.OrdersService;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.*;

@Service
public class OrdersServiceImpl implements OrdersService {

    @Resource
    private OrdersMapper ordersMapper;



    private final String image = "http://10.3.140.4/";

    @Override
    public List<OrdersDto> selectOStatusOrders(Integer oUserId, Integer oStatus) {


        List<Orders> ordersList = ordersMapper.selectOStatusOrders(oUserId, oStatus);

        //根据订单编号封装；键值唯一
        Map<String, List<Orders>> ordersMap = new HashMap<>();

        //map的作用是存储对应订单的创建日期，key是订单编号，value是订单的创建日期
        Map<String, Date> orderTimeMap = new HashMap<>();

        for (Orders orders : ordersList) {
            //获取订单编号
            String oNo = orders.getONo();

            //获取订单的创建日期
            Date createTime = orders.getOCreateTime();

            //h获取图片路径
            String oGoodImg = orders.getOGoodImg();
            orders.setOGoodImg(image + oGoodImg);

            // 获取该订单编号的创建日期
            Date createDate = orderTimeMap.get(oNo);
            if (null == createDate) {
                //map：无序，底层哈希表结构，保证键唯一；K是唯一的，V可以重复；如何键重复，覆盖之间的整个键值对
                //把数据库的多条订单编号编号相同时间用map保存起来，（犹豫key值订单编号相同，所以创建时间会实现覆盖，最后是相同的订单编号只有一个订单创建时间）
                orderTimeMap.put(oNo, createTime);
            }

            // 获取一种该订单编号的所有订单，（相同的订单号有多个商品，每个商品是一条数据,都存存取）
            List<Orders> mapOrdersList = ordersMap.get(oNo);
            if (mapOrdersList == null) {
                mapOrdersList = new ArrayList<>();
                //添加订单数据
                mapOrdersList.add(orders);
                //保存该订单编号的对用订单数据
                ordersMap.put(oNo, mapOrdersList);
            } else {
                mapOrdersList.add(orders);
            }
        }

        //orderTimeMap.forEach((key,value) ->{});


        //返回的最终数据
        List<OrdersDto> ordersDtoList = new ArrayList<>();

        ordersMap.forEach((key, value) -> {
            OrdersDto ordersDto = new OrdersDto();

            //储存订单编号进OrdersDto
            ordersDto.setONo(key);
            //储存订单信息进OrdersDto
            ordersDto.setOrders(value);

            Date orderCreateTime = orderTimeMap.get(key);

            System.out.println("订单创建时间Date:"+orderCreateTime);

            //计算价格总和
            List<Orders> orders = ordersMap.get(key);
            BigDecimal totalPrice = BigDecimal.ZERO;
            for (Orders order : orders) {
                BigDecimal oGoodPrice = order.getOGoodPrice();
                System.out.println("oGoodPrice:"+oGoodPrice);
                Integer oNum = order.getONum();
                BigDecimal num = new BigDecimal(oNum.toString());

                BigDecimal pricea = oGoodPrice.multiply(num);
                totalPrice=totalPrice.add(pricea);

            }

            ordersDto.setTotalPrice(totalPrice);
            System.out.println("计算价格总和"+totalPrice);

            /*SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZZZ");
            Date date = new Date();
            try {
                date = formatter.parse(orderCreateTime);
            } catch (ParseException e) {
                e.printStackTrace();
            }*/

            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            String sDate = sdf.format(orderCreateTime);
            System.out.println("String:"+sDate);

            ordersDto.setOCreateTime(sDate);
            System.out.println(ordersDto.getOCreateTime());
            ordersDtoList.add(ordersDto);

        });


        return ordersDtoList;
    }


    /**
     * 未支付订单页面点击取消订单
     *
     * @param oNo
     * @return
     */
    @Override
    public Boolean updateOStatusOrders(String oNo) {
        Integer updateOStatusOrders = ordersMapper.updateOStatusOrders(oNo);

        //返回成功条数大于0 表示成功修改
        if (updateOStatusOrders > 0) {
            return true;
        } else {
            return false;
        }
    }
    @Override
    public int insertOrder(Orders orders) {
        return ordersMapper.insertOrder(orders);
    }


    /**
     * 根据订单号查询订单订单信息
     * @param oNo
     * @return
     */
    @Override
    public List<Orders> selectOrdersByONo(String oNo) {

        return ordersMapper.selectOrdersByONo(oNo);
    }

    /**
     * 根据订单号查询订单订单信息
     * @param oNo
     * @return
     */
    @Override
    public Orders selectOrderByONo(String oNo) {

        return ordersMapper.selectOrderByONo(oNo);
    }

    /**
     * 修改订单状态
     * @param oNo 订单编号
     * @return
     */
    @Override
    public Integer updateOrdersByoNo(String oNo) {
        return ordersMapper.updateOrdersByoNo(oNo);
    }

    /**
     * 查询所有订单的创建时间到当前时间的 时间差
     * @return
     */
    @Override
    public List<Orders> selectExpireOrders() {
        return ordersMapper.selectExpireOrders();
    }


    @Override
    public int delAllCartByUid(Integer uId) {
        return ordersMapper.delAllCartByUid(uId);
    }

    @Override
    public int insertOrderAndAddress(Integer oAddress, String oNo) {
        return ordersMapper.insertOrderAndAddress(oAddress, oNo);
    }
    @Override
    public List<Orders> selectOrdersByUid(Integer uId) {
        return ordersMapper.selectOrdersByUid(uId);
    }

    @Override
//    @Transactional
    public int changOrderStatus(String oNo) {
        int i = ordersMapper.changOrderStatus(oNo);
        return i;
    }




}


